package org.jeecg.modules.device.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.zhouwr.common.device.vo.InstanceFunctionInputParam;
import com.zhouwr.common.device.vo.ModelFunctionStructure;
import com.zhouwr.common.enums.FunctionParamInputMode;
import com.zhouwr.common.message.SendMessage;
import org.jeecg.modules.device.entity.DeviceFunction;
import org.jeecg.modules.device.entity.FunctionInputParamVo;
import org.jeecg.modules.device.entity.InputData;

import java.util.List;

/**
 * @Description: 功能定义
 * @Author: jeecg-boot
 * @Date: 2020-04-08
 * @Version: V1.0
 */
public interface IDeviceFunctionService extends IService<DeviceFunction> {

    public List<DeviceFunction> selectByMainId(String mainId);

    /**
     * 获取设备功能定义的输入参数，根据功能定义id
     *
     * @param funcId
     * @return
     */
    public List<FunctionInputParamVo> listInputParamByFuncId(String funcId);

    /**
     * 获取设备功能定义的输入参数，根据功能定义id, 和输入方式
     *
     * @param funcId
     * @param inputMode
     * @return
     */
    public List<InputData> listInputDataByFuncId(String funcId, FunctionParamInputMode inputMode);

    /**
     * 获取设备功能定义的输入参数数据，根据功能定义id
     *
     * @param funcId
     * @return
     */
    public List<InputData> listInputDataByFuncId(String funcId);

    /**
     * 获取所有功能定义的输入参数
     *
     * @return
     */
    public List<FunctionInputParamVo> listInputParam();

    /**
     * 获取所有功能定义的输入参数数据
     *
     * @return
     */
    public List<InputData> listInputData();

    /**
     * 重复校验
     *
     * @param functionStructure
     * @return Boolean true 无重复，校验通过
     */
    public Boolean functionParamCheckUnique(ModelFunctionStructure functionStructure);

    /**
     * 异步执行功能
     *
     * @param sendMessage
     * @return
     */
    Boolean invokeFunctionAsync(SendMessage sendMessage);

    /**
     * 同步执行功能
     *
     * @param sendMessage
     * @return
     */

    Object invokeFunctionSync(SendMessage sendMessage);

    /**
     * 生成发送命令
     *
     * @param inputParams
     * @return Object
     */
    public Object generateSendCmds(List<InstanceFunctionInputParam> inputParams);

    /**
     * 生成发送命令
     *
     * @param inputParam
     * @return Object
     */
    public Object generateSendCmd(InstanceFunctionInputParam inputParam);

    /**
     * 根据功能Id，获取模型功能结构
     * @param functionId
     * @return
     */
    public ModelFunctionStructure buildFunctionStructure(String functionId);

    /**
     * 保存功能以及功能参数
     * @param functionStructure
     */
    void saveWithParams(ModelFunctionStructure functionStructure);

    /**
     * 更新功能以及功能参数
     * @param modelFunction
     */
    void saveOrUpdateWithParams(ModelFunctionStructure modelFunction);

}
